#函数闭包
#闭包：将数据封装在一个包里，使用时再去里面去
#本质上闭包层基于函数嵌套搞出来的一种特殊嵌套

#场景一：封装数据防止污染全局 --了解
# def func(age):
#     name='xiaofeng'
#     def f1():
#         print(name,age)
#     def f2():
#         print(name,age)
#     def f3():
#         print(name,age)
#     f1()
#     f2()
#     f3()
# func(123)


#场景二：封装数据到一个包里，使用时再去取
# def task(arg):
#     def inner():
#         print(arg)
#     return inner
# inner_list = []
# for val in [11,22,33]:
#     inner_list.append(task(val))
# inner_list[0]()
# inner_list[1]()
# inner_list[2]()

#TIP:闭包在多线程的应用

#装饰器

"""
需求：请实现在函数执行之前输出before，输出之后输出after
"""
def func():
    print("hello")
    #print(func)
    return func

def outer(org):
    def inner():
        print("before")
        result = org()
        #org()
        print("after")
        #print(result)
        return result #之所以返回值是为了确保是同一个地址处的函数
    #print(inner)
    return inner
ret=outer(func)()
print(ret)
